// 函数
/* function foo() { }
let fun = function () { } */

// 实际上是函数在ts当中的简写方式 利用了ts自动进行类型推断
function foo(x: string, y: number): string {
    return x + y
}
foo('aa', 456);

// 在ts当中的完整的写法
// 在函数当中规定数据类型，主要规定的是形参的数据类型和返回值的数据类型
let fun = function (x: string, y: number): string {
    return x + y
}
console.log(fun('55', 555));
export {
    foo,
}

// 函数的参数问题
// 参数可能有默认值（形参默认值）  这个参数可有可无  有可能说我的函数的参数将来有很多，具体有多少个我也不知道
function boo1(a:string,b:string,c?:string):string{
    return a+b+c;
}
console.log(boo1('y','s'));     //y s undefined
// 形参后面加?：是该参数可传可不传，传入 就是该值，不传就会默认传入undefined
console.log(boo1('y','s','n'));  //y s n 

// ts当中使用形参默认值，意思该参数可传入可不传入，传入使用传入的新值，不传入也不会报错，使用形参默认值
function boo2(a:string,b:string='nihao'):string{
    console.log(b);
    return a+b;
}
console.log(boo2('hello','hh'));

function boo3(a:string,b:string,...args:string[]):string{
    console.log(args);
    return a+b;
}
console.log(boo3('2','2'));
console.log(boo3('2','2','2'));

// 函数中的数据类型如何使用接口来规定

// 函数调用签名
interface Fun{
    // 接口可以描述函数的数据类型（参数的数据类型和返回值的数据类型）
    (x:string,y:string):string
}
let yangyang:Fun=function(x:string,y:string):string{
    return x+y;
}
console.log(yangyang('2','5'));

let mingming:Fun=function(a:string,b:string):string{
    return a+b;
}
console.log(mingming('w','o'));